package cn.wolfcode.crm.web.controller;

import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

//负责拦截异常进行处理
//@ControllerAdvice :打了这个标签的类,下面的打了某些指定标签(@ExceptionHandler,@InitBinder)的方法,可以在其他的controller之前/后 做一些事情
@ControllerAdvice
public class CommonExceptionHandler {


    //可以在其他的controller之前/后 做一些事情 : ExceptionHandler 专门针对异常处理 ,
    // UnauthorizedException : 专门针对  UnauthorizedException 异常的拦截
    @ExceptionHandler(UnauthorizedException.class)
    @ResponseBody
    public Map<String,Object> exceptionHander(UnauthorizedException e , HttpServletRequest request ,
                                HttpServletResponse response,Model model,HandlerMethod handlerMethod) throws IOException {
        //我们的请求有三种情况
        //1.普通请求 ,跳转到没有权限的页面

        //2.ajax请求 ,响应一个JsonReuslt ,msg设置为错误信息  {success:false, msg:"没有权限"}
        //3.数据列表的请求,响应一个PageResult : {total:0 , rows:[]}
        //合并2,3总情况     {success:false, msg:"没有权限" , total:0 , rows:[]}

        //获取当前拦截到的方法上的注解
        ResponseBody responseBody = handlerMethod.getMethodAnnotation(ResponseBody.class);
        if(responseBody == null){
            //1.普通请求 ,跳转到没有权限的页面
            response.sendRedirect("/unpermission.jsp");
            return null;
        }else{

            //2.ajax请求 ,响应一个JsonReuslt ,msg设置为错误信息  {success:false, msg:"没有权限"}
            //3.数据列表的请求,响应一个PageResult : {total:0 , rows:[]}
            //合并2,3总情况     {success:false, msg:"没有权限" , total:0 , rows:[]}
            Map<String,Object> map = new HashMap<>();
            map.put("success",false);
            map.put("msg","没有访问权限");
            map.put("total",0);
            map.put("rows",new ArrayList<>());
            return map;
            //String jsonString = new ObjectMapper().writeValueAsString(map);
        }

    }

}
